import { ref } from 'vue'
import { ElMessage } from 'element-plus'

/**
 * API请求钩子函数
 * @param {Function} apiFunc - API函数
 * @returns {Object} - 包含数据、加载状态、错误信息和执行函数
 */
export function useRequest(apiFunc) {
  const data = ref(null)
  const loading = ref(false)
  const error = ref(null)

  /**
   * 执行API请求
   * @param {...any} args - API函数参数
   * @returns {Promise<any|null>} - 请求结果或null
   */
  const execute = async (...args) => {
    loading.value = true
    error.value = null
    
    try {
      const res = await apiFunc(...args)
      if (res.code === 200) {
        data.value = res.data
        return res.data
      } else {
        error.value = res.message || '请求失败'
        ElMessage.error(error.value)
        return null
      }
    } catch (err) {
      error.value = err.message || '请求异常'
      ElMessage.error(error.value)
      console.error(`API请求失败:`, err)
      return null
    } finally {
      loading.value = false
    }
  }

  return { data, loading, error, execute }
}

/**
 * 分页API请求钩子函数
 * @param {Function} apiFunc - API函数
 * @returns {Object} - 包含数据、分页信息、加载状态和执行函数
 */
export function usePaginationRequest(apiFunc) {
  const list = ref([])
  const total = ref(0)
  const currentPage = ref(1)
  const pageSize = ref(10)
  const loading = ref(false)
  const error = ref(null)

  /**
   * 执行分页API请求
   * @param {Object} params - 请求参数
   * @returns {Promise<Object|null>} - 请求结果或null
   */
  const execute = async (params = {}) => {
    loading.value = true
    error.value = null
    
    try {
      const res = await apiFunc({
        pageNum: currentPage.value,
        pageSize: pageSize.value,
        ...params
      })
      
      if (res.code === 200 && res.data) {
        list.value = res.data.list || []
        total.value = res.data.total || 0
        return res.data
      } else {
        error.value = res.message || '请求失败'
        ElMessage.error(error.value)
        return null
      }
    } catch (err) {
      error.value = err.message || '请求异常'
      ElMessage.error(error.value)
      console.error(`分页API请求失败:`, err)
      return null
    } finally {
      loading.value = false
    }
  }

  /**
   * 处理页码变化
   * @param {number} page - 新页码
   */
  const handleCurrentChange = (page) => {
    currentPage.value = page
    execute()
  }

  /**
   * 处理每页条数变化
   * @param {number} size - 新的每页条数
   */
  const handleSizeChange = (size) => {
    pageSize.value = size
    currentPage.value = 1
    execute()
  }

  return {
    list,
    total,
    currentPage,
    pageSize,
    loading,
    error,
    execute,
    handleCurrentChange,
    handleSizeChange
  }
} 